Presto Resource Groups এবং Workload Management ফিচারগুলি Presto ক্লাস্টারে কোয়েরি এক্সিকিউশন এবং রিসোর্স ব্যবস্থাপনা নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। এগুলি আপনাকে কোয়েরি এক্সিকিউশনের সময় রিসোর্সের সীমা নির্ধারণ করতে এবং বিভিন্ন ধরনের কোয়েরি এবং কাজের মধ্যে লোড ব্যালেন্স করতে সাহায্য করে।
Presto এর Resource Groups বিভিন্ন কোয়েরি বা কাজের জন্য CPU, মেমরি এবং অন্যান্য রিসোর্স সংস্থান ভাগ করতে ব্যবহৃত হয়। Workload Management রিসোর্স বরাদ্দের জন্য একটি কার্যকরী কৌশল প্রদান করে, যা Presto ক্লাস্টারে উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটি নিশ্চিত করে।
Presto-তে Resource Groups একটি কোয়েরি এক্সিকিউশন শিডিউলিং এবং রিসোর্স ব্যালান্সিং পদ্ধতি, যা কোয়েরি এক্সিকিউশন এবং কাজের জন্য নির্দিষ্ট রিসোর্স বরাদ্দ করে। এটি বড় এবং ছোট কোয়েরি এক্সিকিউশনের জন্য একটি নিয়ন্ত্রণ ব্যবস্থা প্রদান করে, যাতে একাধিক কোয়েরি একযোগে চালানোর সময় সিস্টেমের রিসোর্স সুষমভাবে ব্যবহৃত হয়।
Presto Resource Groups কনফিগার করতে একটি কনফিগারেশন ফাইল প্রয়োজন, যা /etc/presto/config.properties
এ নির্ধারণ করতে হয়।
resource-group-manager.config
কনফিগারেশন ফাইলের উদাহরণ:
resource-group-manager.name=configuration
এছাড়া, config.properties
ফাইলে Resource Group Manager এবং অন্যান্য সেটিংস কনফিগার করতে হয়:
resource-group-manager.enabled=true
resource-group-manager.name=configuration
etc/config.properties
ফাইলে Resource Group পলিসি কনফিগার করা:
resource-group-manager.name=configuration
query.max-memory=8GB
query.max-memory-per-node=4GB
query.max-total-memory-per-node=16GB
এখানে:
resource-group-manager.name
: Resource Group Manager এর নাম।query.max-memory
: একক কোয়েরির জন্য বরাদ্দ করা সর্বোচ্চ মেমরি।query.max-memory-per-node
: একক Worker Node এর জন্য বরাদ্দ করা সর্বোচ্চ মেমরি।query.max-total-memory-per-node
: সর্বমোট বরাদ্দ করা মেমরি। এটি নির্ধারণ করে কতটা মেমরি একযোগে Worker Node-তে ব্যবহার করা যাবে।Workload Management (WLM) হল একটি প্রক্রিয়া যা কোয়েরি এক্সিকিউশনের সময় সিস্টেমের রিসোর্স ব্যবস্থাপনায় সহায়তা করে, যাতে একাধিক কোয়েরি একযোগে সুষ্ঠুভাবে সম্পাদিত হয় এবং সিস্টেমের উপরে অতিরিক্ত চাপ না আসে। Presto-তে Workload Management মূলত Resource Groups এবং Query Prioritization ব্যবহার করে কার্যকরভাবে কাজ করে।
resource-groups-config.properties
কনফিগারেশন ফাইল:
resource-groups.configuration-file=etc/resource-groups.conf
এখানে, resource-groups.conf
ফাইলটি Resource Groups-এর কনফিগারেশন ফাইল। আপনি এতে বিভিন্ন গ্রুপ তৈরি করে কোয়েরি পরিচালনা করতে পারবেন।
Presto Resource Groups এবং Workload Management আপনাকে ক্লাস্টারে কোয়েরি এক্সিকিউশন এবং রিসোর্স ব্যবস্থাপনা নিয়ন্ত্রণ করতে সাহায্য করে। এটি স্কেলেবিলিটি, পারফরম্যান্স এবং সিস্টেমের স্থিতিশীলতা নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ। Resource Groups কনফিগারেশন এবং Workload Management সিস্টেমের উপর চাপ কমিয়ে কোয়েরি এক্সিকিউশনের দ্রুততা বাড়ায় এবং একটি সুষম রিসোর্স ব্যবস্থাপনা নিশ্চিত করে।
Presto Resource Groups একটি শক্তিশালী বৈশিষ্ট্য যা Presto ক্লাস্টারের কোয়েরি সম্পাদনার জন্য নির্দিষ্ট রিসোর্স বরাদ্দ করার জন্য ব্যবহৃত হয়। Resource Groups ব্যবহার করে আপনি Presto ক্লাস্টারে কোয়েরির জন্য CPU, মেমরি, এবং অন্যান্য রিসোর্সের সীমা নির্ধারণ করতে পারেন, যাতে নির্দিষ্ট কোয়েরি বা ব্যবহারকারী গ্রুপের জন্য রিসোর্স বরাদ্দ নিয়ন্ত্রণ করা যায়।
এটি সাধারণত লম্বা চলমান কোয়েরি, একাধিক ক্লায়েন্টের জন্য একযোগভাবে কোয়েরি সম্পাদনা, বা ওভারলোড মোকাবেলা করার জন্য ব্যবহার করা হয়।
Presto-তে Resource Groups তৈরি এবং পরিচালনা করার জন্য আপনাকে config.properties
এবং resource-groups.properties
ফাইল কনফিগার করতে হবে।
Presto Resource Groups কনফিগার করতে, আপনাকে etc/resource-groups.properties
ফাইল তৈরি করতে হবে। এই ফাইলের মধ্যে আপনি Resource Groups এবং তাদের সেটিংস কনফিগার করতে পারবেন।
resource-groups.properties
ফাইলের উদাহরণ:
# This file configures the resource groups for Presto
# Resource Group Configuration
# Each resource group gets a set of CPU and memory limits
# Default Resource Group
resource-groups.enabled=true
resource-groups.configuration-file=etc/resource-groups.conf
# Maximum memory limit for queries
query.max-memory=30GB
query.max-memory-per-node=2GB
এখানে:
resource-groups.enabled=true
: এটি Resource Groups সক্ষম করে।resource-groups.configuration-file
: Resource Groups কনফিগারেশনের জন্য পাথ নির্ধারণ করে।Resource Group কনফিগারেশনে আপনি বিভিন্ন গ্রুপ তৈরি করতে পারেন এবং প্রতিটির জন্য নির্দিষ্ট রিসোর্স বরাদ্দ করতে পারেন। এটি resource-groups.conf
ফাইলে নির্ধারণ করা হয়।
resource-groups.conf
ফাইলের উদাহরণ:
# Define Resource Groups and their configurations
# Default Resource Group configuration
default-group {
cpu = 2
memory = 4GB
}
# High Priority Group configuration
high-priority-group {
cpu = 4
memory = 8GB
}
# Low Priority Group configuration
low-priority-group {
cpu = 1
memory = 2GB
}
এখানে:
default-group
: ডিফল্ট গ্রুপের জন্য 2 CPU এবং 4GB মেমরি বরাদ্দ করা হয়েছে।high-priority-group
: উচ্চ প্রাধান্যের জন্য 4 CPU এবং 8GB মেমরি বরাদ্দ করা হয়েছে।low-priority-group
: কম প্রাধান্যের জন্য 1 CPU এবং 2GB মেমরি বরাদ্দ করা হয়েছে।Presto ক্লাস্টারে কোয়েরি কনফিগারেশনের সময়, আপনি high-priority-group, low-priority-group, বা default-group এর মধ্যে কোয়েরি ভাগ করে রিসোর্স বরাদ্দ করতে পারেন।
Presto এর config.properties
ফাইলে Resource Group সক্রিয় করার জন্য, আপনি নীচের সেটিংটি যোগ করতে পারেন।
# Enable resource groups
resource-groups.enabled=true
resource-groups.configuration-file=etc/resource-groups.conf
এটি নিশ্চিত করবে যে, Presto Resource Groups কনফিগারেশন সক্রিয় হয়েছে এবং এটি Presto ক্লাস্টারে ব্যবহৃত হচ্ছে।
Presto ক্লাস্টারে Resource Groups ব্যবহার করতে, কোয়েরি প্রেরণ করার সময় resource group
স্পেসিফাই করতে হবে। এটি সাধারণত কোয়েরি এক্সিকিউশনে প্রাধান্য নির্ধারণের জন্য ব্যবহৃত হয়।
-- Assign a query to a specific resource group
SET SESSION resource_group = 'high-priority-group';
SELECT * FROM hive.default.orders WHERE order_status = 'shipped';
এখানে, কোয়েরিটি high-priority-group
এ বরাদ্দ করা হয়েছে, যা এই গ্রুপের জন্য নির্ধারিত CPU এবং মেমরি রিসোর্সের পরিমাণ ব্যবহার করবে।
Presto তে Resource Groups মনিটর করতে Prometheus এবং Grafana ব্যবহার করা যেতে পারে। Presto বিভিন্ন মেট্রিক্স সংরক্ষণ করে এবং এটি Grafana ড্যাশবোর্ডের মাধ্যমে প্রদর্শিত হয়।
Prometheus মেট্রিক্স উদাহরণ:
presto_query_cpu_time_seconds
: কোয়েরি CPU সময়ের মেট্রিক।presto_query_memory_bytes
: কোয়েরি মেমরি ব্যবহারের মেট্রিক।presto_query_resource_group
: Resource Group এর ব্যবহারের মেট্রিক।এটি আপনাকে দেখাবে, আপনার Resource Group এর জন্য কতটা CPU এবং মেমরি ব্যবহৃত হচ্ছে, এবং এটি আরও বিশ্লেষণ করতে সাহায্য করবে।
Presto ক্লাস্টারে যখন ভারী লোড তৈরি হয়, তখন Resource Groups ব্যবহার করে আপনাকে নানান ধরনের গ্রুপে কোয়েরি ভাগ করে রিসোর্স ব্যবস্থাপনা করতে হবে। আপনি প্রয়োজন অনুযায়ী Resource Groups স্কেল করতে পারেন:
resource-groups.properties
এবং resource-groups.conf
ফাইলের মাধ্যমে Resource Groups কনফিগার করা হয়।Resource Groups ব্যবহারের মাধ্যমে আপনি Presto ক্লাস্টারে রিসোর্স বরাদ্দের নিয়ন্ত্রণ প্রতিষ্ঠা করতে পারেন, যা ক্লাস্টারের স্থায়িত্ব এবং পারফরম্যান্স উন্নত করতে সাহায্য করবে।
Presto একটি ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন, যা বড় এবং জটিল ডেটাসেটের উপর দ্রুত কোয়েরি এক্সিকিউশন সম্পন্ন করতে সক্ষম। তবে, একাধিক কোয়েরি বা একই সময়ে অনেক টাস্ক চলার কারণে সিস্টেমের উপর অতিরিক্ত চাপ পড়তে পারে। Query Throttling এবং Resource Allocation দুটি গুরুত্বপূর্ণ কৌশল যা Presto সার্ভারের কার্যক্ষমতা এবং স্টেবিলিটি নিশ্চিত করার জন্য ব্যবহৃত হয়।
Query Throttling হল প্রক্রিয়া যার মাধ্যমে একাধিক কোয়েরি চালানোর জন্য ডেটাবেসে অনুমোদিত সীমা নির্ধারণ করা হয়, যাতে অতিরিক্ত কোয়েরি বা লোডের কারণে সিস্টেমের কার্যক্ষমতা ক্ষতিগ্রস্ত না হয়। এটি এক্সিকিউশন টাস্কের মধ্যে প্রাথমিকভাবে সিস্টেমের জন্য একটি সীমাবদ্ধতা আরোপ করে।
Presto তে query-throttling কনফিগার করতে, আপনাকে config.properties
এবং query-manager.properties
ফাইলের মাধ্যমে কিছু কনফিগারেশন পরিবর্তন করতে হবে।
config.properties
ফাইলে:
query-manager.enabled=true
query-manager.properties
ফাইলে:
query.max-running=10
query.max-queued=100
এখানে:
Resource Allocation হল Presto-তে উপলব্ধ রিসোর্স (যেমন CPU, মেমরি, এবং ডিস্ক স্পেস) সঠিকভাবে ভাগ করে দেওয়ার প্রক্রিয়া। বিভিন্ন কোয়েরি এবং টাস্কের জন্য সম্পদ বিতরণ করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ, যাতে সিস্টেমে ভারসাম্য বজায় থাকে এবং একাধিক কোয়েরি একসাথে পরিচালিত হয়।
Presto তে রিসোর্স অ্যালোকেশন কনফিগারেশন করতে, কিছু কনফিগারেশন ফাইলের মাধ্যমে CPU এবং মেমরি ব্যবস্থাপনা করা হয়। এগুলি config.properties
, query-manager.properties
, এবং jvm.config
ফাইলে নির্ধারণ করা হয়।
config.properties
ফাইলে মেমরি সীমা নির্ধারণ:query.max-memory=16GB
query.max-memory-per-node=4GB
এখানে:
jvm.config
ফাইলে JVM এর জন্য রিসোর্স সীমা:-Xmx16G
-Xms8G
এখানে:
-Xmx
: সর্বাধিক মেমরি নির্ধারণ করে যা JVM ব্যবহার করতে পারে।-Xms
: JVM এর জন্য প্রাথমিক মেমরি নির্ধারণ করে।Query Throttling এবং Resource Allocation Presto সার্ভারের জন্য অত্যন্ত গুরুত্বপূর্ণ দুটি টুল, যা কোয়েরি এক্সিকিউশনের উপর রেগুলেটরি নিয়ন্ত্রণ রাখে। Query Throttling কোয়েরি লোড এবং রিসোর্স ব্যবহারের সীমা নির্ধারণ করে, যাতে সিস্টেমের পারফরম্যান্স এবং স্থিতিশীলতা বজায় থাকে। Resource Allocation সঠিকভাবে রিসোর্স ভাগ করে, ডেটা প্রসেসিং দ্রুত এবং সিস্টেমের নিরবচ্ছিন্ন কার্যকারিতা নিশ্চিত করে।
Presto একটি ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন এবং এটি ডেটা বিশ্লেষণ প্রক্রিয়াকে দ্রুত এবং কার্যকরী করতে সক্ষম। যেহেতু Presto অনেকগুলি নোডে চলমান থাকে, তাই high availability এবং fault tolerance নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। এটি নিশ্চিত করে যে Presto ক্লাস্টার কোনো নোড ব্যর্থ হলেও চলমান থাকবে এবং কাজের অবিচ্ছিন্নতা বজায় রাখবে।
এই গাইডে, আমরা Presto তে High Availability এবং Fault Tolerance কনফিগারেশন সম্পর্কিত গুরুত্বপূর্ণ পদ্ধতিগুলি আলোচনা করব।
High Availability (HA) কনফিগারেশন নিশ্চিত করে যে, Presto সার্ভিস ব্যর্থ হলে তা স্বয়ংক্রিয়ভাবে অন্য একটি প্রাপ্য নোডে স্থানান্তরিত হয়ে কাজ চালিয়ে যেতে পারে। HA নিশ্চিত করার জন্য, Coordinator Node এবং Worker Nodes -এর জন্য সঠিক কনফিগারেশন প্রয়োজন।
Presto ক্লাস্টারে সাধারণত একটি Coordinator Node থাকে, যেটি সমস্ত কোয়েরি এবং কাজ পরিচালনা করে। তবে, High Availability এর জন্য Multiple Coordinator Nodes ব্যবহার করা যেতে পারে।
Load Balancer:
দুটি বা তার বেশি Coordinator Node একসাথে চালানোর সময়, একটি Load Balancer ব্যবহার করা হয় যা স্বয়ংক্রিয়ভাবে কো-অর্ডিনেটরের মধ্যে লোড বিতরণ করে।
Nginx Load Balancer কনফিগারেশন উদাহরণ:
upstream presto-coordinators {
server <coordinator-1-ip>:8080;
server <coordinator-2-ip>:8080;
}
server {
listen 8080;
location / {
proxy_pass http://presto-coordinators;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
এই কনফিগারেশনে, যখন একটি Coordinator ব্যর্থ হয়, তখন লোড ব্যালান্সার অন্য কো-অর্ডিনেটরের সাথে যোগাযোগ করবে।
Presto তে Worker Nodes ব্যর্থ হলেও সার্ভিসের কার্যকারিতা বজায় রাখতে সক্ষম হতে হয়। Workload Scaling এবং HA নিশ্চিত করতে, Worker Nodes এর সংখ্যা বৃদ্ধি করা যেতে পারে।
Presto তে Coordinator Node HA কনফিগার করতে, নিচের কনফিগারেশন ফাইলগুলিতে কিছু পরিবর্তন করতে হবে:
config.properties (Multiple Coordinator Setup):
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
discovery.uri=http://<coordinator-1-ip>:8080,http://<coordinator-2-ip>:8080
Fault tolerance নিশ্চিত করতে, Presto ক্লাস্টারের বিভিন্ন অংশের জন্য সঠিক কনফিগারেশন করা দরকার, যাতে কোন Node ব্যর্থ হলে অন্য Node তা প্রতিস্থাপন করতে পারে এবং প্রক্রিয়া চলতে থাকে।
Presto তে Fault Tolerance নিশ্চিত করতে, আপনাকে replication এবং load balancing কনফিগার করতে হবে।
ক্লাস্টারের স্কেলিং এবং নোড ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ যখন high-availability এবং fault tolerance নিশ্চিত করতে হবে।
Presto তে Node Expansion খুবই সহজ। আপনি সহজেই নতুন Worker Nodes বা Coordinator Nodes যোগ করতে পারেন। যেমন:
ক্লাস্টারে কোনো নোডের ব্যর্থতা সনাক্ত করা এবং সেই নোডটি প্রতিস্থাপন করা একটি গুরুত্বপূর্ণ কাজ। Presto Web UI বা Prometheus/Grafana এর মাধ্যমে আপনি প্রতিটি নোডের স্বাস্থ্য মনিটর করতে পারেন।
Prometheus Metrics Exporter Example:
metrics.enabled=true
metrics.prometheus.enabled=true
এটি Presto ক্লাস্টারের পারফরম্যান্স এবং স্বাস্থ্য মনিটর করতে সাহায্য করবে।
Presto ক্লাস্টারে High Availability (HA) এবং Fault Tolerance কনফিগারেশন খুবই গুরুত্বপূর্ণ। Multiple Coordinator Nodes, Worker Node Scaling, Load Balancing, এবং Fault Tolerance নিশ্চিত করতে Zookeeper বা Consul এর মত টুলস ব্যবহার করা যায়। এর মাধ্যমে Presto ক্লাস্টারের পারফরম্যান্স এবং সিস্টেমের স্থায়িত্ব বৃদ্ধি পায়, এবং ক্লাস্টারের কোনো অংশ ব্যর্থ হলে সিস্টেম চলমান থাকে।
Presto একটি ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন যা বড় ডেটাসেটকে দ্রুত এবং কার্যকরভাবে প্রসেস করার জন্য তৈরি। Presto ক্লাস্টারে Workload Balancing খুবই গুরুত্বপূর্ণ, কারণ এটি সমস্ত Worker Node-এর মধ্যে কাজের ভারসাম্য নিশ্চিত করে। সঠিক workload balancing পদ্ধতি ব্যবহৃত হলে, সিস্টেমের পারফরম্যান্স বৃদ্ধি পায়, এবং একটি Node-এর উপর অত্যধিক লোড পড়ে না।
Workload balancing নিশ্চিত করে যে:
Presto-তে workload balancing কিছু কৌশল ও কনফিগারেশন দ্বারা পরিচালিত হয়, যা এখানে বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
Presto কো-অর্ডিনেটর নোড কাজগুলিকে বিভিন্ন Worker Node এর মধ্যে সমানভাবে বিতরণ করে। এটি dynamic workload distribution ব্যবহারের মাধ্যমে ঘটে, যাতে কাজের ভারসাম্য বজায় থাকে এবং সব নোডের উপর কাজের চাপ সমানভাবে ভাগ হয়ে যায়।
উদাহরণ:
Presto ক্লাস্টারে লোড ব্যালান্সিং নিশ্চিত করতে, প্রতিটি Worker Node-এ CPU, মেমরি এবং ডিস্ক স্পেস বরাদ্দ করতে হবে। সঠিক রিসোর্স অ্যাসাইনমেন্ট নিশ্চিত করলে, Presto সিস্টেমে থ্রটলিং কম হবে এবং প্রতিটি Worker Node দ্রুত কাজ করতে সক্ষম হবে।
কনফিগারেশন (config.properties):
query.max-memory=10GB
query.max-memory-per-node=2GB
এটি Worker Node-এর জন্য সর্বাধিক মেমরি সীমা নির্ধারণ করে।
Presto-তে কোয়েরি সিডিউলিং এবং কাজের অগ্রাধিকার নির্ধারণ করতে dynamic scheduling ব্যবহার করা হয়। বিভিন্ন কোয়েরির লোডকে সমানভাবে ভাগ করতে এবং কার্যক্ষমতা বজায় রাখতে Presto অগ্রাধিকার ও সময় নির্ধারণের কৌশল ব্যবহার করে।
উদাহরণ:
Presto-তে লোড ব্যালান্সিং শুধুমাত্র Worker Node-এর মধ্যে নয়, Coordinator Node এবং Worker Nodes এর মধ্যে কাজের ভারসাম্য রাখার জন্যও প্রয়োজন। Presto-তে Coordinator Node সাধারণত কোয়েরি পরিকল্পনা তৈরি করে এবং কাজের লোড Worker Node-এ বিতরণ করে। তবে যদি Coordinator Node নিজেই অতিরিক্ত লোডে চলে যায়, তাহলে এটি কাজের চাপ কমাতে Worker Node হিসেবে কাজ করতে পারে।
Presto-তে dynamic scaling সম্ভব, যেখানে সিস্টেমটি নিজের পারফরম্যান্সের উপর ভিত্তি করে নতুন Worker Node যোগ বা অপসারণ করে। যখন কোনো Worker Node অতিরিক্ত লোডে চলে, তখন Presto আরও Worker Node যোগ করে এবং লোড সমানভাবে বিতরণ করে।
Example:
In a cloud environment, Presto can dynamically add more worker nodes during high workloads and scale down when the workload decreases, ensuring optimal resource usage.
Presto-তে Query Caching এবং Result Sharing ব্যবহৃত হয় যাতে একবার সম্পন্ন কোয়েরির ফলাফল পুনরায় ব্যবহৃত হয়। এই কৌশলটি অতিরিক্ত লোড কমানোর জন্য কার্যকর।
Presto সিস্টেমের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হলো Data Locality—এটি নিশ্চিত করে যে ডেটা সেই Worker Node-এ প্রসেস করা হবে যেখানে এটি সংরক্ষিত রয়েছে। এটি কোয়েরি এক্সিকিউশন সময় কমায় এবং সিস্টেমের পারফরম্যান্স বৃদ্ধি করে।
Presto-তে Workload Balancing Techniques খুবই গুরুত্বপূর্ণ কারণ এটি সিস্টেমের কার্যক্ষমতা, লোড ভারসাম্য এবং পারফরম্যান্স উন্নত করতে সহায়ক। বিভিন্ন কৌশল যেমন dynamic query scheduling, worker node resource allocation, elastic scaling, এবং data locality ব্যবহার করে Presto ক্লাস্টারে কার্যকরভাবে কাজ বিভাজন এবং লোড ব্যালান্সিং নিশ্চিত করা যায়। Workload balancing প্রক্রিয়া সঠিকভাবে কার্যকর হলে, Presto আরও দ্রুত এবং স্কেলেবল ডেটা প্রসেসিং প্রদান করতে সক্ষম হবে।
Read more